<?php
/**
 * --------------------------------------------------------------
 * 字符串类函数库
 * Author: zd <kfzphp@126.com>
 * Date: 2018-06-01
 * Project: kfzphp.com
 * --------------------------------------------------------------
 */

/**
 * 对所有外部请求的数据进行过滤处理
 * 过滤函数包括stripslashes、htmlentities、htmlspecialchars和strip_tags
 * @param  [type]  $value [过滤前的字符串]
 * @param  integer $type  [过滤方式]
 * @return [type]         [过滤后的字符串]
 */
function filter($value, $type = 0)
{
    $val = trim($value);
    if (!empty($val)) {
        switch ($type) {
            case '1':
                // 此函数只转换5个字符，和号（&），双引号（“），单引号（‘），小于（<），大于（>），转换为实体形式
                return htmlspecialchars($val, ENT_QUOTES);
                break;
            case '2':
                // 转义预定义的字符：单引号（‘），双引号（“），反斜线（\）与NULL（NULL字符）
                return addslashes($val);
                break;
            case '3':
                // 去除去除 HTML 和 PHP 标记
                return strip_tags($val);
                break;
            case '4':
                // 去除转义反斜线后的字符串（\' 转换为 ' 等等）。双反斜线（\\）被转换为单个反斜线（\）
                return stripslashes($val);
                break;
            default:
                return addslashes(htmlspecialchars($val, ENT_QUOTES));
                break;
        }
    } else {
        return '';
    }
}

/**
 * UTF8中英文字符串截取
 * @param   [string]     $str [要截取的字符串]
 * @param   [integer]    $len [截取的个数]
 * @return  [string]          [截取后的字符串]
 */
function utf8sub($str, $len)
{
    if ($len <= 0) {
        return '';
    }

    $length = strlen($str); //待截取的字符串字节数
    $offset = 0; // 这是截取高位字节时的偏移量
    $chars = 0; // 这是截取到的字符数
    $res = ''; // 这是截取的字符串
    while ($chars < $len && $offset < $length) {
        //只要还没有截取到$len的长度,就继续进行
        $high = decbin(ord(substr($str, $offset, 1))); // 重要突破,已经能够判断高位字节
        if (strlen($high) < 8) {
            $count = 1; // 截取1个字节
        } else if (substr($high, 0, 3) == '110') {
            $count = 2; // 截取2个字节
        } else if (substr($high, 0, 4) == '1110') {
            $count = 3; // 截取3个字节
        } else if (substr($high, 0, 5) == '11110') {
            $count = 4; // 截取4个字节
        } else if (substr($high, 0, 6) == '111110') {
            $count = 5; // 截取5个字节
        } else if (substr($high, 0, 7) == '1111110') {
            $count = 6; // 截取6个字节
        }
        $res .= substr($str, $offset, $count);
        $chars += 1;
        $offset += $count;
    }
    return $res;
}

/**
 * 创建随机数
 * 如果字母和数字混合，则没有字母O
 * @param  integer $length [随机数长度]
 * @param  integer $type   [随机数类型]
 * @return [type]          [随机数]
 */
function create_random($length = 16, $type = 0)
{
    switch ($type) {
        case '1': // 数字
            $chars = "0123456789";
            break;
        case '2': // 小写字母
            $chars = "abcdefghijklmnopqrstuvwxyz";
            break;
        case '3': // 大写字母
            $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            break;
        case '4': // 大写加小写字母
            $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
            break;
        case '5': // 大小写字母加数字
            $chars = "ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz0123456789";
            break;
        case '6': // 大写字母加数字
            $chars = "ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789";
            break;
        default:
            $chars = "abcdefghijklmnpqrstuvwxyz0123456789";
            break;
    }
    $str = "";
    for ($i = 0; $i < $length; $i++) {
        $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
}

/**
 * 把关联数组中相同键名的值组合成新的索引数组
 * @param  [type] $array [关联数组]
 * @param  [type] $field [数组键值]
 * @return [type]        [索引数组]
 */
function my_array_column($array, $field)
{
    if (version_compare(PHP_VERSION, '5.5.0', '<')) {
        $arr = [];
        foreach ($array as $key => $val) {
            $arr[] = $val[$field];
        }
        return $arr;
    } else {
        return array_column($array, $field);
    }
}

/**
 * 序号格式化 (前端补零)
 * @param  [type]  $id   [ID号]
 * @param  string  $num  [补零个数]
 * @param  boolean $auto [是否增1]
 * @return [type]        [格式后的值]
 */
function format_id($id, $num = '2', $auto = false)
{
    $val = !empty($auto) ? intval($id) + 1 : $id;
    $format = '%0' . $num . 's';
    return sprintf($format, $val);
}

/**
 * 价格格式化 (保留两位小数)
 * @param  [type]     $price [价格]
 * @param  integer    $abs   [是否取绝对值]
 * @return [type]            [description]
 */
function format_price($price, $abs = false)
{
    if ($price) {
        return sprintf('%.2f', !empty($abs) ? abs($price) : $price);
    } else {
        return '0.00';
    }
}

/**
 * 格式化数据
 * @param  [type]  $number  [需要格式化的数据]
 * @param  integer $decimal [多少位小数]
 * @param  boolean $abs     [是否取绝对值]
 * @param  string  $default [默认值]
 * @return [type]           [格式后的数据]
 */
function format_number($number, $decimal = '2', $abs = false, $default = '0.00')
{
    if ($number) {
        return sprintf('%.' . $decimal . 'f', !empty($abs) ? abs($number) : $number);
    } else {
        return $default;
    }
}

/**
 * 随机浮点数
 * @param  integer $min    [最小浮点数]
 * @param  integer $max    [最大浮点数]
 * @param  integer $length [小数位]
 */
function random_float($min = 0, $max = 1, $length = 5)
{
    $val = str_pad(1, $length + 1, "0", STR_PAD_RIGHT);
    $minval = floatval($min) * intval($val);
    $maxval = floatval($max) * intval($val);
    $rand = mt_rand($minval, $maxval);
    return number_format(floatval($rand) / floatval($val), $length);
}

/**
 * 生成32位uuid
 * @return [type]     [description]
 */
function uuid()
{
    return md5(uniqid(time(), true));
}

/**
 * 重成18位uuid
 * @param  string     $prefix [description]
 * @return [type]             [description]
 */
function short_uuid($prefix = "")
{
    $str = uniqid('', true);
    return $prefix . substr($str, 0, 13) . substr($str, strpos($str, '.') + 1, 5);
}

/**
 * 重成32位uuid
 * @param  string     $prefix [description]
 * @return [type]             [description]
 */
function create_uuid($prefix = "")
{
    return $prefix . md5(uniqid(md5(microtime(true)), true));
}

/**
 * 创建订单号(28位)
 * 订单号 14位(年月日时分秒)+2位(主用途ID 1支付单号 2提现单号，前面补零)+2位(子分类ID 1微信 2支付宝 3银行卡，前面补零)+6位(会员ID，前面补零)+4位(随机数)
 * @param  [type]     $mno [主用途ID 1支付单号 2转账单号]
 * @param  [type]     $sno [子分类ID 支付方式 1微信 2支付宝 3银行卡]
 * @param  [type]     $id  [会员ID]
 * @return [type]          [description]
 */
function create_no($id = 0, $mno = 0, $sno = 0)
{
    $mno = !empty($mno) ? str_pad($mno, 2, "0", STR_PAD_LEFT) : '';
    $sno = !empty($sno) ? str_pad($sno, 2, "0", STR_PAD_LEFT) : '';
    return date('YmdHis', TIMESTAMP) . $mno . $sno . str_pad($id, 6, "0", STR_PAD_LEFT) . create_random(4, 1);
}

/**
 * 多个连续空格只保留一个
 * @param  [type] $string [待转换的字符串]
 * @return [type]         [description]
 */
function merge_spaces($string)
{
    return preg_replace("/\s(?=\s)/", "\\1", $string);
}

/**
 * 特殊字符过滤
 * @param  [type] $str [要过滤的字符串]
 * @return [type]      [过滤后的字符串]
 */
function str_filter($str)
{
    $str = str_replace('`', '', $str);
    $str = str_replace('·', '', $str);
    $str = str_replace('~', '', $str);
    $str = str_replace('!', '', $str);
    $str = str_replace('！', '', $str);
    $str = str_replace('@', '', $str);
    $str = str_replace('#', '', $str);
    $str = str_replace('$', '', $str);
    $str = str_replace('￥', '', $str);
    $str = str_replace('%', '', $str);
    $str = str_replace('^', '', $str);
    $str = str_replace('……', '', $str);
    $str = str_replace('&', '', $str);
    $str = str_replace('*', '', $str);
    $str = str_replace('(', '', $str);
    $str = str_replace(')', '', $str);
    $str = str_replace('（', '', $str);
    $str = str_replace('）', '', $str);
    $str = str_replace('-', '', $str);
    $str = str_replace('_', '', $str);
    $str = str_replace('——', '', $str);
    $str = str_replace('+', '', $str);
    $str = str_replace('=', '', $str);
    $str = str_replace('|', '', $str);
    $str = str_replace('\\', '', $str);
    $str = str_replace('[', '', $str);
    $str = str_replace(']', '', $str);
    $str = str_replace('【', '', $str);
    $str = str_replace('】', '', $str);
    $str = str_replace('{', '', $str);
    $str = str_replace('}', '', $str);
    $str = str_replace(';', '', $str);
    $str = str_replace('；', '', $str);
    $str = str_replace(':', '', $str);
    $str = str_replace('：', '', $str);
    $str = str_replace('\'', '', $str);
    $str = str_replace('"', '', $str);
    $str = str_replace('“', '', $str);
    $str = str_replace('”', '', $str);
    $str = str_replace(',', '', $str);
    $str = str_replace('，', '', $str);
    $str = str_replace('<', '', $str);
    $str = str_replace('>', '', $str);
    $str = str_replace('《', '', $str);
    $str = str_replace('》', '', $str);
    $str = str_replace('.', '', $str);
    $str = str_replace('。', '', $str);
    $str = str_replace('/', '', $str);
    $str = str_replace('、', '', $str);
    $str = str_replace('?', '', $str);
    $str = str_replace('？', '', $str);
    return trim($str);
}
